From 3cbf7c82e1a046ca38087511f63045b6780c0920 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 7 Feb 2008 10:31:48 +0000 Subject: [PATCH] hvm: Clean up CPUID_0000_0001 return values. The fix to EBX.ApicID was pointed out by Andre Przywara . Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/hvm.c | 37 ++++++++++++++++++++++++++---- xen/arch/x86/hvm/svm/svm.c | 19 ++++----------- xen/arch/x86/hvm/vmx/realmode.c | 1 - xen/arch/x86/hvm/vmx/vmx.c | 17 +++----------- xen/include/asm-x86/hvm/vmx/cpu.h | 32 -------------------------- xen/include/asm-x86/hvm/vmx/vmcs.h | 1 - 6 files changed, 40 insertions(+), 67 deletions(-) delete mode 100644 xen/include/asm-x86/hvm/vmx/cpu.h diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index cdfdec984f..14c965cef9 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1400,6 +1400,7 @@ void hvm_print_line(struct vcpu *v, const char c) spin_unlock(&hd->pbuf_lock); } +#define bitmaskof(idx) (1U << ((idx) & 31)) void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { @@ -1413,16 +1414,44 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx, switch ( input ) { case 0x00000001: - __clear_bit(X86_FEATURE_MWAIT & 31, ecx); - + /* Clear #threads count and poke initial VLAPIC ID. */ + *ebx &= 0x0000FFFFu; + *ebx |= (current->vcpu_id * 2) << 24; + + *ecx &= (bitmaskof(X86_FEATURE_XMM3) | + bitmaskof(X86_FEATURE_SSSE3) | + bitmaskof(X86_FEATURE_CX16) | + bitmaskof(X86_FEATURE_SSE4_1) | + bitmaskof(X86_FEATURE_SSE4_2) | + bitmaskof(X86_FEATURE_POPCNT)); + + *edx &= (bitmaskof(X86_FEATURE_FPU) | + bitmaskof(X86_FEATURE_VME) | + bitmaskof(X86_FEATURE_DE) | + bitmaskof(X86_FEATURE_PSE) | + bitmaskof(X86_FEATURE_TSC) | + bitmaskof(X86_FEATURE_MSR) | + bitmaskof(X86_FEATURE_PAE) | + bitmaskof(X86_FEATURE_MCE) | + bitmaskof(X86_FEATURE_CX8) | + bitmaskof(X86_FEATURE_APIC) | + bitmaskof(X86_FEATURE_SEP) | + bitmaskof(X86_FEATURE_MTRR) | + bitmaskof(X86_FEATURE_PGE) | + bitmaskof(X86_FEATURE_MCA) | + bitmaskof(X86_FEATURE_CMOV) | + bitmaskof(X86_FEATURE_PAT) | + bitmaskof(X86_FEATURE_CLFLSH) | + bitmaskof(X86_FEATURE_MMX) | + bitmaskof(X86_FEATURE_FXSR) | + bitmaskof(X86_FEATURE_XMM) | + bitmaskof(X86_FEATURE_XMM2)); if ( vlapic_hw_disabled(vcpu_vlapic(v)) ) __clear_bit(X86_FEATURE_APIC & 31, edx); - #if CONFIG_PAGING_LEVELS >= 3 if ( !v->domain->arch.hvm_domain.params[HVM_PARAM_PAE_ENABLED] ) #endif __clear_bit(X86_FEATURE_PAE & 31, edx); - __clear_bit(X86_FEATURE_PSE36 & 31, edx); break; case 0x80000001: diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 5a94de6d96..3845946633 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -986,11 +986,6 @@ static void svm_do_no_device_fault(struct vmcb_struct *vmcb) vmcb->cr0 &= ~X86_CR0_TS; } -/* Reserved bits ECX: [31:14], [12:4], [2:1]*/ -#define SVM_VCPU_CPUID_L1_ECX_RESERVED 0xffffdff6 -/* Reserved bits EDX: [31:29], [27], [22:20], [18], [10] */ -#define SVM_VCPU_CPUID_L1_EDX_RESERVED 0xe8740400 - #define bitmaskof(idx) (1U << ((idx) & 31)) static void svm_vmexit_do_cpuid(struct vmcb_struct *vmcb, struct cpu_user_regs *regs) @@ -1005,16 +1000,10 @@ static void svm_vmexit_do_cpuid(struct vmcb_struct *vmcb, switch ( input ) { case 0x00000001: - /* Clear out reserved bits. */ - ecx &= ~SVM_VCPU_CPUID_L1_ECX_RESERVED; - edx &= ~SVM_VCPU_CPUID_L1_EDX_RESERVED; - - /* Guest should only see one logical processor. - * See details on page 23 of AMD CPUID Specification. - */ - __clear_bit(X86_FEATURE_HT & 31, &edx); - ebx &= 0xFF00FFFF; /* clear the logical processor count when HTT=0 */ - ebx |= 0x00010000; /* set to 1 just for precaution */ + /* Mask Intel-only features. */ + ecx &= ~(bitmaskof(X86_FEATURE_SSSE3) | + bitmaskof(X86_FEATURE_SSE4_1) | + bitmaskof(X86_FEATURE_SSE4_2)); break; case 0x80000001: diff --git a/xen/arch/x86/hvm/vmx/realmode.c b/xen/arch/x86/hvm/vmx/realmode.c index 74838d0680..6c591d1f16 100644 --- a/xen/arch/x86/hvm/vmx/realmode.c +++ b/xen/arch/x86/hvm/vmx/realmode.c @@ -18,7 +18,6 @@ #include #include #include -#include #include struct realmode_emulate_ctxt { diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 6bd496f8d7..50efb4fcd9 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -1267,23 +1266,13 @@ void vmx_cpuid_intercept( switch ( input ) { case 0x00000001: - *ecx &= ~VMX_VCPU_CPUID_L1_ECX_RESERVED; - *ebx &= NUM_THREADS_RESET_MASK; - *ecx &= ~(bitmaskof(X86_FEATURE_VMXE) | - bitmaskof(X86_FEATURE_EST) | - bitmaskof(X86_FEATURE_TM2) | - bitmaskof(X86_FEATURE_CID) | - bitmaskof(X86_FEATURE_PDCM) | - bitmaskof(X86_FEATURE_DSCPL)); - *edx &= ~(bitmaskof(X86_FEATURE_HT) | - bitmaskof(X86_FEATURE_ACPI) | - bitmaskof(X86_FEATURE_ACC) | - bitmaskof(X86_FEATURE_DS)); + /* Mask AMD-only features. */ + *ecx &= ~(bitmaskof(X86_FEATURE_POPCNT)); break; case 0x00000004: cpuid_count(input, count, eax, ebx, ecx, edx); - *eax &= NUM_CORES_RESET_MASK; + *eax &= 0x3FFF; /* one core */ break; case 0x00000006: diff --git a/xen/include/asm-x86/hvm/vmx/cpu.h b/xen/include/asm-x86/hvm/vmx/cpu.h deleted file mode 100644 index decd01e829..0000000000 --- a/xen/include/asm-x86/hvm/vmx/cpu.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * cpu.h: Virtual CPU state - * Copyright (c) 2004, Intel Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307 USA. - * - */ -#ifndef __ASM_X86_HVM_VMX_CPU_H__ -#define __ASM_X86_HVM_VMX_CPU_H__ - -#define NUM_CORES_RESET_MASK 0x00003FFF -#define NUM_THREADS_RESET_MASK 0xFF00FFFF - -#define VMX_VCPU_CPUID_L1_ECX_RESERVED_18 0x00040000 -#define VMX_VCPU_CPUID_L1_ECX_RESERVED_6 0x00000040 - -#define VMX_VCPU_CPUID_L1_ECX_RESERVED \ - ( VMX_VCPU_CPUID_L1_ECX_RESERVED_18 | \ - VMX_VCPU_CPUID_L1_ECX_RESERVED_6 ) - -#endif /* __ASM_X86_HVM_VMX_CPU_H__ */ diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index a8d5e4d12b..e73cbad7e0 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -21,7 +21,6 @@ #include #include -#include #include extern void start_vmx(void); -- 2.30.2